#include "BlockQueue.hpp"
#include <unistd.h>
#include "Task.hpp"

// 多生产多消费的扩展
// void *comsumer(void *args)
// {
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);
//     while (true)
//     {
//         sleep(1);
//         Task t = bq->Pop();
//         int res = t.Excute();
//         std::cout << "消费一个任务: x = " << t.X() << " y = " << t.Y() << " result = " << res << std::endl;
//     }

//     return nullptr;
// }

// void *productor(void *args)
// {
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);
//     int x = 1;
//     int y = 1;
//     while (true)
//     {
//         // sleep(1);
//         std::cout << "生产一个任务: " << x << " + " << y << std::endl;
//         bq->Push(Task(x, y));
//         ++x;
//         ++y;
//     }

//     return nullptr;
// }

// int main()
// {
//     BlockQueue<Task> *bq = new BlockQueue<Task>;

//     pthread_t c[2], p[3];

//     pthread_create(c, nullptr, comsumer, bq);
//     pthread_create(c + 1, nullptr, comsumer, bq);
//     pthread_create(p, nullptr, productor, bq);
//     pthread_create(p + 1, nullptr, productor, bq);
//     pthread_create(p + 2, nullptr, productor, bq);

//     pthread_join(c[0], nullptr);
//     pthread_join(c[1], nullptr);
//     pthread_join(p[0], nullptr);
//     pthread_join(p[1], nullptr);
//     pthread_join(p[2], nullptr);

//     return 0;
// }

// 阻塞队列中数据的扩展 -- 使其传入对象或者函数
// void* comsumer(void* args)
// {
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);
//     while(true)
//     {
//         sleep(1);
//         Task t = bq->Pop();
//         int res = t.Excute();
//         std::cout << "消费一个任务: x = " << t.X() << " y = " << t.Y() << " result = " << res << std::endl;
//     }

//     return nullptr;
// }

// void* productor(void* args)
// {
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);
//     int x = 1;
//     int y = 1;
//     while (true)
//     {
//         // sleep(1);
//         std::cout << "生产一个任务: " << x << " + " << y << std::endl;
//         bq->Push(Task(x, y));
//         ++x;
//         ++y;
//     }

//     return nullptr;
// }

// int main()
// {
//     BlockQueue<Task> *bq = new BlockQueue<Task>;

//     pthread_t c, p;

//     pthread_create(&c, nullptr, comsumer, bq);
//     pthread_create(&p, nullptr, productor, bq);

//     pthread_join(c, nullptr);
//     pthread_join(p, nullptr);

//     return 0;
// }


void *comsumer(void *args)
{
    BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(args);
    while (true)
    {
        // sleep(1);
        int x = bq->Pop();
        std::cout << "消费一个数据: " << x << std::endl;
    }

    return nullptr;
}

void *productor(void *args)
{
    BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(args);
    int count = 0;
    while (true)
    {
        sleep(1);
        std::cout << "生产一个数据: " << count << std::endl;
        bq->Push(count);
        ++count;
    }

    return nullptr;
}

int main()
{
    BlockQueue<int> *bq = new BlockQueue<int>;

    pthread_t c, p;

    pthread_create(&c, nullptr, comsumer, bq);
    pthread_create(&p, nullptr, productor, bq);

    pthread_join(c, nullptr);
    pthread_join(p, nullptr);

    return 0;
}